数组循环移位(编程之美)

编程之美上面提供了很好的思路,那么我就用代码实现,我这个代码实现可以循环左移和循环右移

 

// Perverse.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
void Reverse(char a[],int begin,int end)
{
	for (;begin<end;begin++,end--)
	{
		char temp=a[end];
		a[end]=a[begin];
		a[begin]=temp;
	}
}
void RightShift(char *array,int N,int K)
{
	K%=N;
	Reverse(array,0,N-K-1);
	Reverse(array,N-K,N-1);
	Reverse(array,0,N-1);

}
void LeftShift(char* array,int N,int K)
{
	K%=N;
	Reverse(array,K,N-1);
	Reverse(array,0,K-1);
	Reverse(array,0,N-1);
}

int _tmain(int argc, _TCHAR* argv[])
{
	char a[]="abcd1234";

	/*Reverse(a,1,2);
	for (int i=0;i<5;i++)
	{
		printf("%3c ",a[i]);
	}
	system("pause");*/
	LeftShift(a,8,2);

	for (int i=0;i<8;i++)
	{
		printf("%c",a[i]);
	}
	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现该功能的示例代码: ``` .model small .stack 100h .data N equ 4 ; 数组元素个数,这里假设为4 AS db 10h, 20h, 30h, 40h ; 源数组 AD db N dup(?) ; 目标数组 AVG db ? ; 平均值 MIN db ? ; 最小值 .code main proc mov ax, @data mov ds, ax ; 初始化数据段寄存器 ; 为源数组赋初值 mov si, offset AS mov cx, N mov al, 1 again1: mov [si], al inc al inc si loop again1 ; 将源数组搬到目标数组 mov si, offset AS mov di, offset AD mov cx, N again2: mov al, [si] mov [di], al inc si inc di loop again2 ; 求平均值和最小值 mov si, offset AS mov cx, N mov al, [si] mov bl, al ; 初始化最小值为第一个元素 add al, bl ; 初始化平均值为第一个元素 again3: inc si mov al, [si] add bl, al add al, AVG cmp al, MIN jl update_min update_min: mov MIN, al loop again3 mov al, N div AVG ; 求平均值 mov AVG, al ; 将源数组向右循环移动两个位置 mov si, offset AS mov cl, 2 ; 向右移动两个位置 again4: mov al, [si+N-1] ; 保存最后一个元素 mov ch, [si+N-2] mov cl, [si+N-3] mov [si+2], al ; 向右移动两个位置 mov [si+1], ch mov [si], cl loop again4 mov ah, 4ch int 21h ; 程序结束 main endp end main ``` 以上代码中,首先定义了数组元素个数N以及源数组AS和目标数组AD。在main过程中,程序先为源数组赋初值,然后将源数组搬到目标数组,接着求平均值和最小值,并将源数组向右循环移动两个位置。注意,在实现循环移位操作时,我们只需要用一个寄存器保存最后一个元素,然后逐个向右移动即可,不需要将数组元素复制到其它数组中。最后,程序退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值